﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Negocio.Entidades;
using Negocio.AccesoDatos;
using System.Data;
using System.Data.SqlClient;

namespace Negocio.Gestores
{
    public class GestorRifas
    {
        public static List<Boleta> obtenerBoletasDeSocio(int numero_socio)
        {
            try
            {
                return RifasDAO.obtenerBoletas(numero_socio, DateTime.Today.Year);
            }
            catch (Exception ex)
            {

                throw new ApplicationException(ex.Message.ToString());
            }
            
        }

        public static DataTable ObtenerDDLTipoSorteo()
        {
            return RifasDAO.consultarSQL("Select id_tipoSorteo, descripcion from TipoSorteo");
        }

        public static void grabarBoleta(Boleta b)
        {
            try
            {
                RifasDAO.grabarBoleta(b);                
            }
            catch (Exception ex)
            {
                throw new ApplicationException(ex.Message.ToString());
            }

        }

        public static void asignarBoletasASocios(int año)
        {
            try
            {
                SqlDataReader bxs = RifasDAO.consultarSqlDReader("select b.numeracion from boletaxsocio bxs inner join boleta b "+
                    " on bxs.registroboleta=b.registroboleta where b.año_boleta = @año_boleta" , new SqlParameter("@año_boleta", año));
                if (!bxs.HasRows)
                {
                    List<Boleta> boletas = RifasDAO.obtenerBoletas(-1, año);
                    List<Socio> socios = GestorSocio.ObtenerSocios();

                    int cantidad = (int)(boletas.Count / socios.Count);
                    int j = boletas.Count - 1;

                    foreach (Socio s in socios)
                    {
                        for (int i = 0; i < cantidad; i++)
                        {
                            string cadena = "INSERT into BoletaXSocio (numeroSocio, registroBoleta) VALUES (@numeroSocio, @registroBoleta)";
                            SqlParameter pr_num_soc = new SqlParameter("@numeroSocio", s.numero_socio);
                            SqlParameter pr_boleta = new SqlParameter("@registroBoleta", boletas[j].registroBoleta);
                            RifasDAO.ejecutarSQLTransaccion(cadena, pr_num_soc, pr_boleta);
                            j--;
                        }
                    }
                    if (j > 0)
                    {
                        for (int i = 0; i < j; i++)
                        {
                            string cadena = "INSERT into BoletaXSocio (numeroSocio, registroBoleta) VALUES (@numeroSocio, @registroBoleta)";
                            SqlParameter pr_num_soc = new SqlParameter("@numeroSocio", socios[0].numero_socio);
                            SqlParameter pr_boleta = new SqlParameter("@registroBoleta", boletas[j].registroBoleta);
                            RifasDAO.ejecutarSQLTransaccion(cadena, pr_num_soc, pr_boleta);
                            j--;
                        }
                    }
                }
                else
                    throw new ApplicationException("Ya se asiganaron las boletas en este año. ");
            }
            catch (Exception e)
            {
                throw new ApplicationException(e.Message.ToString());
            }  
        }

        public static DataTable obtenerCuponesDeBoleta(int registroBoleta)
        {
            try
            {
                return RifasDAO.obtenerCuponesDeBoleta(registroBoleta);
            }
            catch (Exception ex)
            {

                throw new ApplicationException(ex.Message.ToString());
            }
        }

        public static bool esPosibleboleta()
        {
            return RifasDAO.sePuedeNuevaDiagramacion(DateTime.Today.Year);
        }

        public static bool esPosibleSorteo()
        {
            return RifasDAO.sePuedeDiagramarSorteo(DateTime.Today.Year);
        }

        public static int? grabarFactura(Factura f)
        {
            try
            {
                return RifasDAO.grabarFactura(f);
            }
            catch (Exception ex)
            {
                throw new ApplicationException(ex.Message);
            }
        }

        public static DataTable mostrarInformeFactura(int nroSocio, string fechaDesde, string fechaHasta, int estadoSocio)
        {
            DataTable dt = new DataTable();
            try
            {
                string cadena = "SELECT f.numeroFactura as 'Número', tf.descripcion as 'Factura ', ti.descripcion as 'IVA-Socio', " +
                    "tp.descripcion as 'Forma de Pago', f.fechaFactura as 'Fecha', f.numeroSocio as 'Socio Nro.', s.Nombre, s.Apellido, " +
                    "f.total as 'Total' FROM Factura f left outer join TipoFactura tf on f.id_tipoFactura=tf.id_tipoFactura " +
                    "left outer join TipoIva ti on f.id_tipoIva=ti.id_tipoIva left outer join TipoPago tp on f.id_tipoPago=tp.id_tipoPago " +
                    "left outer join Socio s on f.numeroSocio=s.numeroSocio WHERE 1=1 ";

                if (nroSocio > 0)
                    cadena += " and f.numeroSocio=@numeroSocio ";

                if (fechaDesde != "")
                    cadena += " and f.fechaFactura > '" + fechaDesde + "' ";

                if (fechaHasta != "")
                    cadena += " and f.fechaFactura < '" + fechaHasta + "' ";

                if (estadoSocio > -1)
                    cadena += " and s.id_estado=@estadoSocio ";

                SqlParameter prSocio = new SqlParameter("@numeroSocio", nroSocio);
                SqlParameter prEstado = new SqlParameter("@estadoSocio", estadoSocio);

                dt = RifasDAO.consultarSQL(cadena, prSocio, prEstado);
            }
            catch (Exception ex)
            {
                throw new ApplicationException(ex.Message);
            }
            return dt;
        }
    }
}
